/*
 * 文 件 名:  commonTool.java
 * 版    权:   深圳埃思欧纳信息咨询有限公司版权所有. YYYY-YYYY,  All rights reserved
 * 描    述:   <描述>
 * 修 改 人:  honny.huang
 * 修改时间: 2010-10-18
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package com.common.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * <一句话功能简述> <功能详细描述>
 *
 * @author honny.huang
 * @version [版本号, 2010-10-18]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */

public class RegExpUtil 
{
    /**    
     * 获取字符串长度，中文字符算2.
     * <功能详细描述>
     * @param str
     * @return [参数说明]
     * 
     * @return int [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static int getStrLen(String str)
    {
        int count=0;
        String regEx = "[\\u4e00-\\u9fa5]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        while(m.find())count++;
        return str.length()+count;
     }
    
    /**
     * 检查是否符合Email格式. 举例：username@htomail.com
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isEmail(String str)
    {
    	String regEx = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
    	Pattern p = Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    /**
     * 检查是否符合手机号格式. 举例：13975986315
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isMobile(String str)
    {
    	String regEx = "^((13[0-9])|(15[0|3|6|7|8|9])|(18[6|8|9]))\\d{8}$";
    	Pattern p = Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    /**    
     * 检查是否包含特殊字符
     * <功能详细描述>
     * @param str
     * @return [参数说明]
     * 
     * @return int [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean checkSpecialChar(String str)
    {
    	String regEx = "[\u4e00-\u9fa5]*[a-z]*[A-Z]*\\d*-*_*\\s*";
    	Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.find();
    }
    
    /**
     * 匹配首尾空白字符，可以用来删除行首行尾的空白字符
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean checkSpace(String str)
    {
    	String regEx = "^\\s*|\\s*$";
    	Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.find();
    }

    /**
     * 检查是否为腾讯qq号码。举例：10000
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isQq(String str)
    {
    	String regEx = "[1-9][0-9]{4,}";
    	Pattern p = Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    /**
     * 检查是否符合普通电话格式. 举例：010-86523725
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isPhone(String str)
    {
    	String regEx = "(\\d{3}-)(\\d{8})|(\\d{4}-)(\\d{7})";
    	Pattern p =Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    /**
     * 检查是否符合电话格式(包括手机号码和普通电话). 举例：13975986315、010-86523725
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isMobileOrPhone(String str)
    {
    	String regEx = "(\\d{3}-)(\\d{8})|(\\d{4}-)(\\d{7})|(^(13[0-9]|15[0|3|6|7|8|9]|18[6|8|9])\\d{8}$)";
    	Pattern p =Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    /**
     * 检查是否为邮政编码. 举例：100083
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isPostCode(String str)
    {
    	String regEx = "[1-9]\\d{5}$"; 
    	Pattern p = Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    /**
     * 检查是否符合网页地址格式. 举例：http://www.google.com
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isUrl(String str)
    {
    	String  regEx = "http://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.matches();
    }
    
    /**
     * 检查是否只由英文字母组成. 举例：abcDefG
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isEnglish(String str)
    {
    	String regEx = "[A-Za-z]+"; 
    	Pattern p = Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    /**
     * 是否只由中文组成. 举例：你好
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员][\u4e00-\u9fa5]
     */
    public static boolean isChinese(String str)
    {
    	String regEx = "[\\u0391-\\uFFE5]+";
    	Pattern p = Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    /**
     * 必须以字母开头、可带字母、数字、下划线及小数点，大小为3~20个字符. 举例：abc_1,abc,abc1
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isUserName(String str)
    {
    	String regEx = "^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){2,19}$";
    	Pattern p = Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    /**
     * 检查是否只为整数
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isNumber(String str)
    {
    	 String regEx = "^-?\\d+$";
    	 Pattern p = Pattern.compile(regEx);
    	 Matcher m = p.matcher(str);
    	 return m.matches();
    }
    
    /**
     * 检查是否匹配回车换行。
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isCarriageLineFeed(String str)
    {
    	String regEx = "\r\n";
    	Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.find();
    }

    /**
     * 检查是否匹配空白行。可以用来删除空白行
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isBlankLine(String str)
    {
    	String regEx = "\\n\\s*\\r";
    	Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.matches();
    }

   
    /**
     * 检查是否只为数字
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isInteger(String str)
    {
    	 String regEx = "^-?\\d+(\\.\\d+)*$";
    	 Pattern p = Pattern.compile(regEx);
    	 Matcher m = p.matcher(str);
    	 return m.matches();
    }
        
    /**
     * 检查是否只为整数或小数
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isDouble(String str)
    { 
    	 String regEx = "[-\\+]?\\d+(\\.\\d+)?";
    	 Pattern p = Pattern.compile(regEx);
    	 Matcher m = p.matcher(str);
    	 return m.matches();
    }
    
    /**
     * 检查是否匹配正整数
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isPositiveNumber(String str)
    {
    	String regEx = "^[1-9]\\d*$";
    	Pattern p = Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    /**
     * 检查是否匹配非负整数（正整数+0）
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isNonNegativeNumber(String str)
    {
	 	String regEx = "^[1-9]\\d*|0$";
	 	Pattern p = Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
	}
    
    /**
     * 检查是否匹配负整数
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isNegativeNumber(String str)
    {
    	String regEx = "^-[1-9]\\d*$";
    	Pattern p = Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    /**
     * 检查是否匹配正整数
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isNonPositiveNumber(String str)
    {
    	String regEx = "^-[1-9]\\d*|0$";
    	Pattern p = Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    /**
     * 检查是否符合货币格式. 举例：22.2
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isCurrency(String str)
    {
    	String regEx = "\\d+(\\.\\d+)?";
    	Pattern p = Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    /**
     * 检查是否为合法的IP地址. 举例：10.81.32.1
     * <功能详细描述>
     * @param str
     * @return
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isIP(String str)
    {
    	String regEx = "[0-9.]{1,20}";
    	Pattern p = Pattern.compile(regEx);
    	Matcher m = p.matcher(str);
    	return m.matches();
    }
    
    //调试
    public static void main(String args[])
    {
     
    	String string="as";
    	boolean flag = RegExpUtil.checkSpace(string);
    	System.out.print(flag);
//    	String filePath = "E:\\Workspaces\\test\\WebRoot\\send_content.tp";
//		File f = new File(filePath);    
//		FileReader fileReader = null;
//		try 
//		{
//			fileReader = new FileReader(f);
//		} catch (FileNotFoundException e) 
//		{
//			e.printStackTrace();
//		}    
//	    BufferedReader br = new BufferedReader(fileReader);    
//	    String str;    
//	    try 
//	    {
//			 while((str = br.readLine()) != null)    
//		     {   
//				//	str = br.readLine();
//				//	System.out.print("==========");
//				  boolean flag = RegExp.isCarriageLineFeed(str);
//				  System.out.println(flag);    
//				  System.out.println(str);    
//			 }
//		} catch (IOException e)
//		{
//			e.printStackTrace();
//		}    

    }
}
